package springbucks.controller;

import cn.hutool.core.util.IdUtil;
import org.springframework.web.bind.annotation.*;
import springbucks.dto.GradeDTO;
import springbucks.entity.ResultVO;
import springbucks.entity.Student;
import springbucks.service.LeaderBoardService;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @author wangyidi
 * @version V1.0
 * @Description 排行榜
 * 业务需求描述：
 * 对学生进行评分 并输出 学生的分数的排行榜 从高到底进行排序，
 * 其中满分100分。允许对同一个学生进行多次评分，该同学的评分为多次的评分中的最大值
 *
 * 业务实现过程：
 * 主要使用的 是 redis 中的 ZSet 存储结构
 * ZSet 是有序集合,redis的有序集合与集合一样也是String类型元素的集合，不允许有重复的元素。
 * 每一个元素都会关联一个double类型的分数，redis正是通过分数来为集合中的成员进行从小到大的排序。
 * 有序集合中的成员是唯一的，但是分数可以重复。
 *
 *
 * @date 2022/11/23 3:26 下午
 */
@RestController
@RequestMapping(value = "/leaderboard")
public class LeaderBoardController {

    private List<Student> students;

    @Resource
    private LeaderBoardService leaderBoardService;

    /**
     * @Description 初始化学生列表
     * @author wangyidi
     * @date 2022/11/23 5:06 下午
     * @return void
    **/
    @PostMapping(value = "/init")
    public ResultVO init () {
        if(students == null) {
            students = new ArrayList<>();
            Student student1 = Student.builder().id(IdUtil.randomUUID()).name("小王").build();
            Student student2 = Student.builder().id(IdUtil.randomUUID()).name("小张").build();
            Student student3 = Student.builder().id(IdUtil.randomUUID()).name("小刘").build();
            students.add(student1);
            students.add(student2);
            students.add(student3);
        }
        return ResultVO.success(students);
    }


    /**
     * @Description 根据学生ID 进行打分
     * @author wangyidi
     * @date 2022/11/23 5:06 下午
     * @return ResultVO
     **/
    @PostMapping(value = "/grade")
    public ResultVO grade(@RequestBody GradeDTO gradeDTO) {
        leaderBoardService.grade(gradeDTO,students);
        return ResultVO.success(students);
    }


    /**
     * @Description 排行榜
     * @author wangyidi
     * @date 2022/11/23 5:06 下午
     * @return ResultVO
     **/
    @GetMapping(value = "/leaderboard")
    public ResultVO leaderboard() {
        List<Student> list = leaderBoardService.leaderboard(students);
        return ResultVO.success(list);
    }
}
